<?php
namespace SwoStar\Foundation;

use SwoStar\Console\Input;
use SwoStar\Container\Container;
use SwoStar\Rpc\RpcServer;

use SwoStar\Server\Http\Server as HttpServer;

class Application extends Container
{
    protected const SWOSTAR_WELCOME = "
      _____                     _____     ___
     /  __/             ____   /  __/  __/  /__   ___ __      __  __
     \__ \  | | /| / / / __ \  \__ \  /_   ___/  /  _`  |    / /_/ /
     __/ /  | |/ |/ / / /_/ /  __/ /   /  /_    |  (_|  |   /  ___/
    /___/   |__/\__/  \____/  /___/    \___/     \___/\_|  /__/
    ";

    protected $basePath = "";

    /**
     * 定义要加载的驱动
     * @var array
     */
    protected $bootstraps = [
        //加载config目录下的所有配置信息
        Bootstrap\LoadConfiguration::class,

        //加载驱动，加载服务提供者
        Bootstrap\ServerPrivoder::class
    ];

    /**
     * 在启动http服务之前，先加载框架，加载驱动
     * 注意：这里并没有加载到onworkstart函数中，因为在启动http服务之前加载框架
     * 也相当于加载到了常驻内存中，不过还是有些区别，也可以自行加载到workstart中
     * Application constructor.
     * @param $path    .值为：/docker/www/work/18/activities
     */
    function __construct($path)
    {
        if (!empty($path)) {
            $this->setBasePath($path);
        }

        //设置单利
        self::setInstance($this);

        // 加载框架驱动
        $this->bootstrap();

        Input::info(self::SWOSTAR_WELCOME, "启动项目");
    }

    /**
     * 加载框架驱动
     */
    public function bootstrap()
    {
        foreach ($this->bootstraps as $key => $bootstrap) {
            (new $bootstrap())->bootstrap($this);
        }
    }

    /**
     * 运行框架，启动http服务
     * @param $argv
     * @throws \Exception
     */
    public function run($argv)
    {
        $server = null;

        switch ($argv[1]) {
            case 'http:start':
                $server = new HttpServer($this);
                break;

            default:
                break;
        }

        // 判断是否开启rpc
        if ($this->make("config")->get("server.rpc.flag")) {
            new RpcServer($this,$server);
        }

        // 就是启动swostar
        $server->start();
    }

    /**
     * 获取当前服务器的config文件夹所在的完整配置路径
     * 返回数据：/docker/www/work/18/activities/config
     * @return string
     */
    public function getConfigPath()
    {

        return $this->getBasePath()."/config";
    }

    /**
     * 获取当前服务器中项目文件夹所在的完整配置路径
     * 返回数据：/docker/www/work/18/activities
     * @return string
     */
    public function getBasePath()
    {
        return $this->basePath;
    }

    /**
     * 设置当前服务器中项目文件夹所在的完整配置路径
     * 存储的数据： /docker/www/work/18/activities
     * @param $path
     */
    public function setBasePath($path)
    {
        $this->basePath = \rtrim($path, '\/');
    }

}
